import os
import urllib.parse
from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool

# 加载环境变量
load_dotenv()

# 数据库连接配置
DB_HOST = os.getenv('DB_HOST', '192.168.20.94')
DB_PORT = os.getenv('DB_PORT', '3307')
DB_USER = os.getenv('DB_USER', 'root')
DB_PASSWORD = os.getenv('DB_PASSWORD', 'Root@123@3307')
DB_NAME = os.getenv('DB_NAME', 'WHDB')

# 对密码中的特殊字符进行URL编码
encoded_password = urllib.parse.quote_plus(DB_PASSWORD)

# 创建数据库连接字符串，添加改进的连接池配置
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DB_USER}:{encoded_password}@{DB_HOST}:{DB_PORT}/{DB_NAME}"

# 创建数据库引擎，使用更稳定的连接池配置来解决数据包序列错误
engine = create_engine(
    SQLALCHEMY_DATABASE_URL, 
    echo=False,
    poolclass=QueuePool,      # 使用队列池
    pool_size=5,              # 连接池大小
    max_overflow=10,          # 最大溢出连接数
    pool_pre_ping=True,       # 连接前预检查，解决连接失效问题
    pool_recycle=3600,        # 连接回收时间(秒)，防止长时间连接失效
    connect_args={
        "charset": "utf8mb4",
        "autocommit": True,
        "connect_timeout": 30,   # 连接超时时间
        "read_timeout": 30,      # 读取超时时间
        "write_timeout": 30      # 写入超时时间
    }
)

# 创建数据库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建基础模型类
Base = declarative_base()

# 获取数据库会话的依赖函数
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()